/**
  题目:
    给你一个链表数组，每个链表都已经按升序排列。
    请你将所有链表合并到一个升序链表中，返回合并后的链表。
    示例 1：

    输入：lists = [[1,4,5],[1,3,4],[2,6]]
    输出：[1,1,2,3,4,4,5,6]
    解释：链表数组如下：
    [
      1->4->5,
      1->3->4,
      2->6
    ]
    将它们合并到一个有序链表中得到。
    1->1->2->3->4->4->5->6
    示例 2：

    输入：lists = []
    输出：[]
    示例 3：

    输入：lists = [[]]
    输出：[]


    提示：

    k == lists.length
    0 <= k <= 10^4
    0 <= lists[i].length <= 500
    -10^4 <= lists[i][j] <= 10^4
    lists[i] 按 升序 排列
    lists[i].length 的总和不超过 10^4
    
 思路: 递归 + 化简问题为合并两个有序列表
 
 效果:
    执行用时：8 ms, 在所有 Go 提交中击败了94.91%的用户
    内存消耗：5.3 MB, 在所有 Go 提交中击败了66.95%的用户
*/

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

 /**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.empty()){
            return nullptr;
        }
        if(lists.size()==1){
            return lists[0];
        }
        for(int i=0;i<lists.size()-1;i+=2){
            lists.push_back(merge(lists[i],lists[i+1]));
            
        }
        return lists[lists.size() - 1];
    }
    ListNode* merge(ListNode* l1,ListNode*l2){
        if(!l1||!l2){
            return l1?l1:l2;
        }
        ListNode* dummy=new ListNode(0);
        ListNode*head=dummy;
        while(l1&&l2){
            if(l1->val>l2->val){
                head->next=l2;
                l2=l2->next;
            }else{
                head->next=l1;
                l1=l1->next;
            }
            head=head->next;
        }
        head->next=nullptr;
        if(l1){
            head->next=l1;
        }
        if(l2){
            head->next=l2;
        }
        return  dummy->next;
    }
};